package com.google.zxing.client.android;

import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


/**
 * 处理zxing和zbar扫描结果，主要是处理中文乱码
 */
public class ZxStringUtil {
    private static final String TAG = "ZxStringUtil";
    /**
     * 简单处理下乱码，不一定全好用
     *
     * @param s
     * @return
     */
    public static String processQrCodeString(String s) {
        Charset[] formats = new Charset[]{
                StandardCharsets.UTF_8,
                Charset.forName("GB2312"),
                Charset.forName("GB18030")
        };
        if (!isNormal(s)) {
            try {
                byte[] bytes = s.getBytes(StandardCharsets.ISO_8859_1);
                byte[] bytes2 = s.getBytes("GBK");
                for (Charset charset : formats) {
                    String ss = new String(bytes, charset);
                    if (isNormal(ss)) {
                        return ss;
                    }
                    String ss2 = new String(bytes2, charset);
                    if (isNormal(ss2)) {
                        return ss2;
                    }
                }
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }

        }
        return s;
    }


    /**
     * 是否可以用某种编码进行编码
     * @param s
     * @param charset
     * @return
     */
    public static boolean canEncode(String s,String charset){
        return Charset.forName(charset).newEncoder().canEncode(s);
    }

    /**
     * 是否只包含固定一些字符
     *
     * @param str
     * @return
     */
    public static boolean isNormal(String str) {
        if (str.startsWith("\ufeff")) {
            str = str.replace("\ufeff", "");
        }
        //（）
        char[] charArray = str.toCharArray();
        for (char c : charArray) {
//            if ((c >= 32 && c <= 127 && c != 63) || (c >= '\u4e00' && c <= '\u9fa5')/* || (c >= 'A' && c <= 'z')*/) {
            //如果是正常需要的字符：汉字,字母，数字和ascii里的显示字符，就算正确的，出现不对的，就false
            if ((c >= 32 && c <= 127 && c != 63) || isContainChinese(c)) {
            } else {
                return false;
            }
        }
        return !isSpecialCharacter(str);
    }

    /**
     * 判断字符是否是中文，能校验是否为中文标点符号
     *
     * @param str 待校验字符
     * @return 是否为中文
     */
    public static boolean isContainChinese(char str) {
        // 中文字
        Pattern p = Pattern.compile("[\u4e00-\u9fa5]");
        Matcher m = p.matcher(String.valueOf(str));
        if (m.find()) {
            return true;
        }

        // 中文标点符号
        p = Pattern.compile("[\uFF01]|[\uFF0C-\uFF0E]|[\uFF1A-\uFF1B]|[\uFF1F]|[\uFF08-\uFF09]|[\u3001-\u3002]|[\u3010-\u3011]|[\u201C-\u201D]|[\u2013-\u2014]|[\u2018-\u2019]|[\u2026]|[\u3008-\u300F]|[\u3014-\u3015]");
        m = p.matcher(String.valueOf(str));
        return m.find();
    }

    private static boolean isSpecialCharacter(String str) {
        //是"�"这个特殊字符的乱码情况
        if (str.contains("ï¿½")) {
            return true;
        }
        return false;
    }
}
